package com.hlxj.license.server;

import com.hlxj.license.server.model.LicenseInfo;
import com.hlxj.license.server.service.LicenseInfoService;
import com.hlxj.license.server.util.DateUtil;
import com.hlxj.license.server.util.FileUtil;
import com.hlxj.license.server.util.RSAUtil;
import com.hlxj.license.server.util.SerialNumberUtil;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;

import java.sql.Timestamp;
import java.util.*;

import static com.hlxj.license.server.util.StringUtil.bytesToString;
import static com.hlxj.license.server.util.StringUtil.stringToBytes;

/**
 * @功能:【LicenseServer 】
 * @作者:代守诚
 * @日期:2019/5/20
 * @时间:21:44
 */
@Component
public class LicenseServer {
//    private static final Logger logger = LogManager.getLogger(LicenseServer.class);
//
//    private final  static Integer UUID_LENGTH = 10000;
//
//    @Autowired
//    private LicenseInfoService licenseInfoService;
//
//    //初始化生成公钥私钥
    public static void main(String[] args) throws Exception{
        System.err.println("公钥加密——私钥解密");
        String uuid = "c804609f89b542a3888d00405ee13dbc";
        String cpuid = SerialNumberUtil.getCPUSerial().toUpperCase().replace(" ", "");
        String mainboard = SerialNumberUtil.getMotherboardSN().toUpperCase().replace(" ", "");
//        String disk = SerialNumberUtil.getHardDiskSN("c").toUpperCase().replace(" ", "");
        String mac = SerialNumberUtil.getMac().toUpperCase().replace(" ", "");

        String registerTime = DateUtil.getCurrentTime();
        StringBuilder strBuilder = new StringBuilder();
        strBuilder.append("UUID").append("=").append(uuid).append(";");
        strBuilder.append("CPU").append("=").append(cpuid).append(";").append("Mainboard").append("=").append(mainboard).append(";");
        strBuilder.append("MAC").append("=").append(mac).append(";").append("registerTime").append("=").append(registerTime);
        byte[] data = strBuilder.toString().getBytes();
        byte[] encodedData = RSAUtil.encryptByPublicKey(data, FileUtil.readFileContent("publicKey"));
        System.out.println("***********************************" + encodedData.length);
        String encodeData = bytesToString(encodedData);
        System.out.println("加密后文字：\r\n" + encodeData);
        byte[] dataq = stringToBytes(encodeData);
        System.out.println("***********************************" + dataq.length);
        byte[] decodedData = RSAUtil.decryptByPrivateKey(encodedData, FileUtil.readFileContent("privateKey"));
        String target = new String(decodedData);
        System.out.println("解密后文字: \r\n" + target);
    }

//    public void getUUID() {
//        List<String> uuidList = new ArrayList<>();
//        for(int i = 0; i < UUID_LENGTH; i ++) {
//            String uuid = UUID.randomUUID().toString().replace("-", "");
//            uuidList.add(uuid);
//        }
//
//        licenseInfoService.inserBatch(uuidList);
//    }public void getUUID() {
//        List<String> uuidList = new ArrayList<>();
//        for(int i = 0; i < UUID_LENGTH; i ++) {
//            String uuid = UUID.randomUUID().toString().replace("-", "");
//            uuidList.add(uuid);
//        }
//
//        licenseInfoService.inserBatch(uuidList);
//    }

//    //厂商解密验证uuid是否存在并且将相关的信息存在数据库中
//    public Map<String, Object> decode(byte[] encodeData) {
//        String privateKey = FileUtil.readFileContent("privateKey");
//        byte[] decodeData = null;
//        try{
//            decodeData = RSAUtil.decryptByPrivateKey(encodeData, privateKey);
//        }catch (Exception e){
//            e.printStackTrace();
//        }
//        String target = new String(decodeData);
//
//        String[] info = target.split(";");
//        Map<String, String> computerMap = new HashMap<>();
//        Arrays.asList(info).forEach(str ->{
//            String[] computer = str.split("=");
//            computerMap.put(computer[0], computer[1]);
//        });
//
//        //根据uuid获取是否存在这个信息，存在添加进入数据库
//        LicenseInfo licenseInfo = licenseInfoService.getLicenseInfo(computerMap.get("UUID"));
//        if(licenseInfo != null && StringUtils.isEmpty(licenseInfo.getCpuId())) {
//            licenseInfo.setCpuId(computerMap.get("CPU"));
//            licenseInfo.setMac(computerMap.get("MAC"));
//            licenseInfo.setMainBoard(computerMap.get("Mainboard"));
//            licenseInfo.setEndTime(DateUtil.getTimestamp(computerMap.get("endTime")));
//            licenseInfo.setModTime(new Timestamp(System.currentTimeMillis()));
//
//            licenseInfoService.updateLicenseInfo(licenseInfo);
//        }
//        //生成加密文件和签名返回给用户端
//        logger.info("私钥加密——公钥解密");
//        byte[] encodedData = null;
//        String sign = null;
//        try{
//            encodedData = RSAUtil.encryptByPrivateKey(decodeData, privateKey);
//            sign = RSAUtil.sign(encodedData, privateKey);
//        }catch (Exception e){
//            e.printStackTrace();
//        }
//
//        Map<String, Object> signMap = new HashMap<>();
//        signMap.put("encodedData", encodedData);
//        signMap.put("sign", sign);
//        return signMap;
//    }//厂商解密验证uuid是否存在并且将相关的信息存在数据库中
//    public Map<String, Object> decode(byte[] encodeData) {
//        String privateKey = FileUtil.readFileContent("privateKey");
//        byte[] decodeData = null;
//        try{
//            decodeData = RSAUtil.decryptByPrivateKey(encodeData, privateKey);
//        }catch (Exception e){
//            e.printStackTrace();
//        }
//        String target = new String(decodeData);
//
//        String[] info = target.split(";");
//        Map<String, String> computerMap = new HashMap<>();
//        Arrays.asList(info).forEach(str ->{
//            String[] computer = str.split("=");
//            computerMap.put(computer[0], computer[1]);
//        });
//
//        //根据uuid获取是否存在这个信息，存在添加进入数据库
//        LicenseInfo licenseInfo = licenseInfoService.getLicenseInfo(computerMap.get("UUID"));
//        if(licenseInfo != null && StringUtils.isEmpty(licenseInfo.getCpuId())) {
//            licenseInfo.setCpuId(computerMap.get("CPU"));
//            licenseInfo.setMac(computerMap.get("MAC"));
//            licenseInfo.setMainBoard(computerMap.get("Mainboard"));
//            licenseInfo.setEndTime(DateUtil.getTimestamp(computerMap.get("endTime")));
//            licenseInfo.setModTime(new Timestamp(System.currentTimeMillis()));
//
//            licenseInfoService.updateLicenseInfo(licenseInfo);
//        }
//        //生成加密文件和签名返回给用户端
//        logger.info("私钥加密——公钥解密");
//        byte[] encodedData = null;
//        String sign = null;
//        try{
//            encodedData = RSAUtil.encryptByPrivateKey(decodeData, privateKey);
//            sign = RSAUtil.sign(encodedData, privateKey);
//        }catch (Exception e){
//            e.printStackTrace();
//        }
//
//        Map<String, Object> signMap = new HashMap<>();
//        signMap.put("encodedData", encodedData);
//        signMap.put("sign", sign);
//        return signMap;
//    }
}
